#include "zoo.h"
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>

using namespace std;

string(erro);
// alinea a
int Animal::maisJovem = 9999;

Veterinario::Veterinario(string name, long code) :
		nome(name), codOrdem(code)
{}

Animal::Animal(string name, int age) :
		nome(name), idade(age), vet(NULL)
{
	if (age < maisJovem)
		maisJovem = age;
}

Cao::Cao(string name, int age, string r) :
		Animal(name, age), raca(r)
{}

Voador::Voador(int max_speed, int max_height) :
		velocidade_max(max_speed), altura_max(max_height)
{}

Morcego::Morcego(string name, int age, int max_speed, int max_height) :
		Animal(name, age), Voador(max_speed, max_height)
{}

string Animal::getNome()
{
	return nome;
}

int Animal::getMaisJovem()
{
	return maisJovem;
}


// alinea b
void Zoo::adicionaAnimal(Animal *a1)
{
	animais.push_back(a1);
}

int Zoo::numAnimais()
{
	return animais.size();
}


// alinea c
string Veterinario::getNome() const
{
	return nome;
}

long Veterinario::getCodOrdem() const
{
	return codOrdem;
}

string Animal::imprime()
{
	string informacao;
	stringstream id;

	id << idade;
	//informacao = id.str();

	informacao = nome + ", " + id.str();

	return informacao;
}

string Cao::imprime()
{
	string informacao;
	stringstream c;

	informacao = Animal::imprime();

	if (this->vet != NULL)
	{
		c << vet->getCodOrdem();
		informacao += ", " + vet->getNome() + ", " + c.str();
	}

	informacao += ", " + raca;

	return informacao;
}

string Voador::imprime()
{
	string informacao, num1, num2;
	stringstream n1, n2;

	n1 << velocidade_max;
	num1 = n1.str();
	n2 << altura_max;
	num2 = n2.str();

	informacao = ", " + num1 + ", " + num2;

	return informacao;
}

string Morcego::imprime()
{
	string informacao;
	stringstream c;

	informacao = Animal::imprime();

	if (this->vet != NULL)
		{
			c << vet->getCodOrdem();
			informacao += ", " + vet->getNome() + ", " + c.str();
		}

	informacao += Voador::imprime();

	return informacao;
}

string Zoo::imprime()
{
	string informacao = "";

	for (unsigned int i = 0; i < animais.size(); i++)
		informacao += animais[i]->imprime() + "\n";

	return informacao;
}

// alinea d
bool Cao::eJovem() const
{
	if (this->idade < 5)
		return true;
	else
		return false;
}

bool Morcego::eJovem() const
{
	if (this->idade < 4)
		return true;
	else
		return false;
}

bool Zoo::animalJovem(string nomeA)
{
	for (unsigned int i = 0; i < animais.size(); i++)
	{
		if (animais[i]->getNome() == nomeA)
		{
			if (animais[i]->eJovem())
				return true;
			else
				return false;
		}
	}

	return false;
}

// alinea e
int Zoo::numVeterinarios()
{
	return veterinarios.size();
}

Veterinario* Animal::getVet() const
{
	return vet;
}

void Animal::setVet(Veterinario *v)
{
	vet = v;
}

void Zoo::alocaVeterinarios(istream &isV)
{
	string n;
	string codigo;
	long c;

	while (getline(isV, n))
	{
		getline(isV, codigo);
		c = atol(codigo.c_str());
		Veterinario *v = new Veterinario(n, c);

		veterinarios.push_back(v);
	}

	int j = 0;
	for (int i = 0; i < numAnimais(); i++)
	{
		if (j < numVeterinarios())
			animais[i]->setVet(veterinarios[j]);
		else
			j = 0;

		j++;
	}
}

// alinea f
bool Zoo::removeVeterinario(string nomeV)
{
	for (unsigned int i = 0; i < animais.size(); i++)
	{
		if (animais[i]->getVet()->getNome() == nomeV)
		{
			for (unsigned int j = 0; j < veterinarios.size(); j++)
			{
				if (veterinarios[j]->getNome() == nomeV)
				{
					if (j < veterinarios.size())
						animais[i]->setVet(veterinarios[j+1]);
					else
						animais[i]->setVet(veterinarios[0]);
				}
			}
		}
	}

	for (unsigned int k = 0; k < veterinarios.size(); k++)
	{
		if (veterinarios[k]->getNome() == nomeV)
		{
			veterinarios.erase(veterinarios.begin() + k);
			return true;
		}
	}

	return false;
}

// alinea h

vector<Animal *> Zoo::getAnimais() const
{
	return animais;
}

int Animal::getIdade()
{
	return idade;
}

bool Zoo::operator < (Zoo& zoo2) const
{
	int soma1 = 0;
	int soma2 = 0;

	for (unsigned int i = 0; i < animais.size(); i++)
		soma1 += animais[i]->getIdade();

	for (int j = 0; j < zoo2.numAnimais(); j++)
		soma2 += zoo2.getAnimais()[j]->getIdade();

	if (soma1 < soma2)
		return true;

	return false;
}



